﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ChatClient
{
    public delegate void ConnectionRequestEventHandler(string userName, string serverIp, int port);
    public delegate void ConnectionBreakRequestEventHandler();
    

    public partial class ContactForm : Form
    {
        public event ConnectionRequestEventHandler ConnectionRequest;
        public event ConnectionBreakRequestEventHandler ConnectionBreakRequest;
        public event SendMessageEventHandler SendMessage;

        Dictionary<string, ChatClientForm> ChatClient;

        string myUserName;

        public ContactForm()
        {
            InitializeComponent();
            ChatClient = new Dictionary<string, ChatClientForm>();
        }

        private void buttonConnect_Click(object sender, EventArgs e)
        {
            if (buttonConnect.Text.Equals("Conectar"))
            {
                // Verificamos que esten llenados todos los campos necesarios
                if (tbServerIP.Text == "" || tbServerPort.Text == "" || tbUserName.Text == "")
                    MessageBox.Show("Debe llenar los 3 campos para poder realizar la conexion");
                else if (tbUserName.Text == "server")
                    MessageBox.Show("El usuario 'server' es un nombre reservado");
                else
                {
                    OnConnectionRequest(tbUserName.Text, tbServerIP.Text,
                        Convert.ToInt32(tbServerPort.Text));
                }
            }
            else
                OnConnectionBreakRequest();
        }

        /// <summary>
        /// Indica que la conexion con el servidor ya esta lista.
        /// </summary>
        public void ConnectionReady()
        {
            // Deshabilitamos los textbox de conexion, cambiamos el texto del boton y
            // habilitamos el envio de mensajes
            tbServerIP.Enabled = false;
            tbServerPort.Enabled = false;
            tbUserName.Enabled = false;
            myUserName = tbUserName.Text;
            buttonConnect.Text = "Desconectar";
        }

        /// <summary>
        /// Indica que se cerro la conexion con el servidor.
        /// </summary>
        public void ConnectionBreak()
        {
            // Cambiamos los valores correspondientes
            tbServerIP.Enabled = true;
            tbServerPort.Enabled = true;
            tbUserName.Enabled = true;
            buttonConnect.Text = "Conectar";
        }


        /// <summary>
        /// Ejecuta el evento de solicitud de conexion.
        /// </summary>
        /// <param name="userName">Nombre del usuario</param>
        /// <param name="serverIp">Ip del servidor</param>
        /// <param name="port">Puerto del servidor</param>
        private void OnConnectionRequest(string userName, string serverIp, int port)
        {
            if (ConnectionRequest != null)
                ConnectionRequest(userName, serverIp, port);
        }

        /// <summary>
        /// Ejecuta el evento de termino de conexion
        /// </summary>
        private void OnConnectionBreakRequest()
        {
            if (ConnectionBreakRequest != null) 
                ConnectionBreakRequest();

            contact_list.Items.Clear();
        }

        /// <summary>
        /// Termina la conexion al cerrar el form.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            OnConnectionBreakRequest();
        }


        /// <summary>
        /// Recibe los nuevos mensajes que llegan al chat
        /// </summary>
        /// <param name="user">Usuario que envia el mensaje</param>
        /// <param name="message">Mensaje enviado</param>
        public void NewMessageArrive(string user, string message)
        {
            if (user == "server")
            {
                //Manejo mensaje del servidor
                int markPosition = message.IndexOf(":");
				// Separamos la acción del mensaje
				string action = message.Substring(0, markPosition);
				string targetUser = message.Substring(markPosition + 1);

                if (targetUser != myUserName) 
                {
                    if (action == "add") //Agrego usuario a la lista de contactos
                        contact_list.Items.Add(targetUser, targetUser, 0);
                    
                    if (action == "del") //Quito usuario a la lista de contactos
                        contact_list.Items.RemoveByKey(targetUser);
                }
            }
            else
            {
                //cambio el color de fondo a naranjo cuando llega un nuevo mensaje y no tengo abierta esa ventana
                if (!ChatClient.ContainsKey(user))
                    setUserColor(user);
                createChatClientForm(user);
                ChatClient[user].NewMessageArrive(user, message);
            }

        }

        /// <summary>
        /// Quito un chat cliente de la lista de ventanas abiertas
        /// </summary>
        /// <param name="user"></param>
        void dialog_ChatClientFormClosed(string user)
        {
            ChatClient.Remove(user);
        }

        /// <summary>
        /// Abre un nuevo chat
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void contact_list_DoubleClick(object sender, EventArgs e)
        {
            string name = contact_list.SelectedItems[0].Text;
            createChatClientForm(name);
            resetUserColor(name);
            ChatClient[name].Show();
        }

        /// <summary>
        /// En caso de no existir ventana para chat con 'user' la crea
        /// </summary>
        /// <param name="user"></param>
        void createChatClientForm(string user) 
        {
            if (!ChatClient.ContainsKey(user))
            {
                ChatClientForm dialog = new ChatClientForm(user, myUserName);
                ChatClient.Add(user, dialog);
                dialog.SendMessage += SendMessage;
                dialog.ChatClientFormClosed += new ChatClientFormClosedEventHandler(dialog_ChatClientFormClosed);

                setUserColor(user);
                //dialog.Show();
            }
        }

        private void setUserColor(string user) 
        {
            if (contact_list.Items.ContainsKey(user))
            {
                ListViewItem aux = contact_list.Items[user];
                aux.BackColor = Color.Orange;
            }
        }

        private void resetUserColor(string user)
        {
            if (contact_list.Items.ContainsKey(user)) 
            {
                ListViewItem aux = contact_list.Items[user];
                aux.BackColor = Color.White;
            }
        }

    }
}
